<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <p data-lake-id="2e28f671b5413de0afb580dc2ccfdd8f_p_155" id="2e28f671b5413de0afb580dc2ccfdd8f_p_155"><span data-lake-id="u1c34b609" id="u1c34b609">JDK1.2 以后，Java 对引用的概念进行了扩充，将引用分为</span><strong><span data-lake-id="u95a9f157" id="u95a9f157">强引用、软引用、弱引用、虚引用</span></strong><span data-lake-id="u61bf7df4" id="u61bf7df4">四种（引用强度逐渐减弱）</span></p>
  <p data-lake-id="u631cbc8a" id="u631cbc8a"><span data-lake-id="ud463356f" id="ud463356f">​</span><br></p>
  <p data-lake-id="u7ef61204" id="u7ef61204"><strong><span data-lake-id="uebae156b" id="uebae156b">强引用</span></strong><span data-lake-id="u8d360af5" id="u8d360af5">：强引用是Java的默认引用形式，使用时不需要显示定义。如果一个对象具有强引用，那垃圾回收器绝不会回收它（可达时）。当内存空间不足，Java虚拟机宁愿抛出OutOfMemoryError错误，使程序异常终止，也不会靠随意回收具有强引用的对象来解决内存不足的问题。</span></p>
  <p data-lake-id="u891c3db6" id="u891c3db6"><span data-lake-id="u86517384" id="u86517384">​</span><br></p>
  <pre lang="java"><code>
String[] arr = new String[]{"a", "b", "c"};
</code></pre>
  <p data-lake-id="u5f6ec640" id="u5f6ec640"><span data-lake-id="udb79a00d" id="udb79a00d"><br></span><strong><span data-lake-id="u0f348553" id="u0f348553">弱引用</span></strong><span data-lake-id="u3ecc202d" id="u3ecc202d">： 如果一个对象只具有弱引用，无论内存充足与否，Java GC后对象如果只有弱引用将会被自动回收。</span></p>
  <p data-lake-id="u0961df57" id="u0961df57"><span data-lake-id="uf7b0e0ba" id="uf7b0e0ba"><br><br></span></p>
  <pre lang="java"><code>
WeakReference&lt;String[]&gt; weakBean = new WeakReference&lt;String[]&gt;(new String[]{"a", "b", "c"});
</code></pre>
  <p data-lake-id="uc86ccb41" id="uc86ccb41"><span data-lake-id="u8416c466" id="u8416c466"><br></span><strong><span data-lake-id="u66cb4897" id="u66cb4897">软引用</span></strong><span data-lake-id="u26912cc8" id="u26912cc8">： 软引用不会保证对象一定不会被回收，只能最大可能保证。软引用和弱引用的特性基本一致， 主要的区别在于软引用在内存不足时才会被回收。如果一个对象只具有软引用，Java GC在内存充足的时候不会回收它，内存不足时才会被回收。<br><br></span></p>
  <pre lang="java"><code>
SoftReference&lt;String[]&gt; softBean = new SoftReference&lt;String[]&gt;(new String[]{"a", "b", "c"});
</code></pre>
  <p data-lake-id="ueb2519c7" id="ueb2519c7"><span data-lake-id="u55e1aae1" id="u55e1aae1"><br></span><strong><span data-lake-id="uc5d02dae" id="uc5d02dae">虚引用</span></strong><span data-lake-id="u79190b74" id="u79190b74">：java.lang.ref.PhantomReference 类中只有一个方法 get()，而且几乎没有实现，只是返回 null。如果一个对象仅有虚引用，那么它就像没有任何引用一样，在任何时候都可能被 gc 回收。虚引用主要用来跟踪对象被垃圾回收的活动。</span><span data-lake-id="u4420d63b" id="u4420d63b" class="lake-fontsize-11" style="color: var(--yq-text-primary)"><br><br></span></p>
  <table data-lake-id="UBltk" id="UBltk" margin="true" class="lake-table" style="width: 723px">
   <colgroup>
    <col width="140">
    <col width="128">
    <col width="131">
    <col width="137">
    <col width="187">
   </colgroup>
   <tbody>
    <tr data-lake-id="u4f681fcc" id="u4f681fcc">
     <td data-lake-id="u9ec7e66f" id="u9ec7e66f" style="background-color: #D8DAD9">
      <p data-lake-id="u8c6c6487" id="u8c6c6487" style="text-align: left"><strong><span data-lake-id="ub3ff4458" id="ub3ff4458" style="color: rgb(18, 18, 18)">特性</span></strong></p></td>
     <td data-lake-id="u56588939" id="u56588939" style="background-color: #D8DAD9">
      <p data-lake-id="u6f8f3b2f" id="u6f8f3b2f" style="text-align: left"><strong><span data-lake-id="u2ce1f2c8" id="u2ce1f2c8" style="color: rgb(18, 18, 18)">强引用</span></strong></p></td>
     <td data-lake-id="ub34024dd" id="ub34024dd" style="background-color: #D8DAD9">
      <p data-lake-id="ub7151ab4" id="ub7151ab4" style="text-align: left"><strong><span data-lake-id="ue1d4f336" id="ue1d4f336" style="color: rgb(18, 18, 18)">软引用</span></strong></p></td>
     <td data-lake-id="uef37f3c7" id="uef37f3c7" style="background-color: #D8DAD9">
      <p data-lake-id="u35c77164" id="u35c77164" style="text-align: left"><strong><span data-lake-id="u4d89afd4" id="u4d89afd4" style="color: rgb(18, 18, 18)">弱引用</span></strong></p></td>
     <td data-lake-id="u2806318a" id="u2806318a" style="background-color: #D8DAD9">
      <p data-lake-id="u600a389a" id="u600a389a" style="text-align: left"><strong><span data-lake-id="ub549d474" id="ub549d474" style="color: rgb(18, 18, 18)">虚引用</span></strong></p></td>
    </tr>
    <tr data-lake-id="u090749ea" id="u090749ea">
     <td data-lake-id="u26110d23" id="u26110d23">
      <p data-lake-id="ub415b012" id="ub415b012" style="text-align: left"><span data-lake-id="ub5c1c370" id="ub5c1c370" style="color: rgb(18, 18, 18)">生命周期</span></p></td>
     <td data-lake-id="uf77e4888" id="uf77e4888">
      <p data-lake-id="u627ac571" id="u627ac571" style="text-align: left"><span data-lake-id="uba1a54a1" id="uba1a54a1" style="color: rgb(18, 18, 18)">最长</span></p></td>
     <td data-lake-id="u24ec9ee2" id="u24ec9ee2">
      <p data-lake-id="u8ef0db00" id="u8ef0db00" style="text-align: left"><span data-lake-id="uba1efdc3" id="uba1efdc3" style="color: rgb(18, 18, 18)">次于强引用</span></p></td>
     <td data-lake-id="u578f8061" id="u578f8061">
      <p data-lake-id="u7b86b4b5" id="u7b86b4b5" style="text-align: left"><span data-lake-id="u1308a8ca" id="u1308a8ca" style="color: rgb(18, 18, 18)">次于软引用</span></p></td>
     <td data-lake-id="u168983f6" id="u168983f6">
      <p data-lake-id="ue38df5dc" id="ue38df5dc"><span data-lake-id="u8d325776" id="u8d325776">次于弱引用</span></p></td>
    </tr>
    <tr data-lake-id="u73f637b7" id="u73f637b7">
     <td data-lake-id="u74db2ab5" id="u74db2ab5">
      <p data-lake-id="u048fb40e" id="u048fb40e" style="text-align: left"><span data-lake-id="u88bdb71b" id="u88bdb71b" style="color: rgb(18, 18, 18)">OOM前被清理</span></p></td>
     <td data-lake-id="ud01ab464" id="ud01ab464">
      <p data-lake-id="uce13832e" id="uce13832e" style="text-align: left"><span data-lake-id="ue5c2db8d" id="ue5c2db8d" style="color: rgb(18, 18, 18)">否</span></p></td>
     <td data-lake-id="ued473d88" id="ued473d88">
      <p data-lake-id="u464d9abd" id="u464d9abd" style="text-align: left"><span data-lake-id="u2c12857f" id="u2c12857f" style="color: rgb(18, 18, 18)">是</span></p></td>
     <td data-lake-id="u090b6d56" id="u090b6d56">
      <p data-lake-id="u5716813c" id="u5716813c" style="text-align: left"><span data-lake-id="u44dddbb1" id="u44dddbb1" style="color: rgb(18, 18, 18)">是</span></p></td>
     <td data-lake-id="ud59a4e3b" id="ud59a4e3b">
      <p data-lake-id="u2d48413e" id="u2d48413e"><span data-lake-id="u9dd18cd6" id="u9dd18cd6">是</span></p></td>
    </tr>
    <tr data-lake-id="ud2492ee6" id="ud2492ee6">
     <td data-lake-id="uf191de7c" id="uf191de7c">
      <p data-lake-id="u71d3ed72" id="u71d3ed72" style="text-align: left"><span data-lake-id="ud7fc6205" id="ud7fc6205" style="color: rgb(18, 18, 18)">Gc前被清理</span></p></td>
     <td data-lake-id="u238d23e4" id="u238d23e4">
      <p data-lake-id="u9adaf601" id="u9adaf601" style="text-align: left"><span data-lake-id="u55d3b485" id="u55d3b485" style="color: rgb(18, 18, 18)">否</span></p></td>
     <td data-lake-id="uc170804b" id="uc170804b">
      <p data-lake-id="ub822cb5d" id="ub822cb5d" style="text-align: left"><span data-lake-id="u3d949f0c" id="u3d949f0c" style="color: rgb(18, 18, 18)">否</span></p></td>
     <td data-lake-id="u99806a2d" id="u99806a2d">
      <p data-lake-id="u8ee17eff" id="u8ee17eff" style="text-align: left"><span data-lake-id="u0c8b3637" id="u0c8b3637" style="color: rgb(18, 18, 18)">是</span></p></td>
     <td data-lake-id="ufd3c9309" id="ufd3c9309">
      <p data-lake-id="ub57d2b79" id="ub57d2b79"><span data-lake-id="uf14f0287" id="uf14f0287">是</span></p></td>
    </tr>
   </tbody>
  </table>
  <p data-lake-id="u2fb2ea14" id="u2fb2ea14"><br></p>
  <h3 data-lake-id="NMyil" id="NMyil"><span data-lake-id="u0eb3fdf2" id="u0eb3fdf2">弱引用的例子</span></h3>
  <p data-lake-id="u9581a42b" id="u9581a42b"><span data-lake-id="uc0a4a324" id="uc0a4a324">ThreadLocal就是用了弱引用。下面是一个简单ThreadLocal和Thread的引用图：</span></p>
  <p data-lake-id="u3507b38f" id="u3507b38f"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1701173767324-f610bdd5-4408-451a-b996-6e1ae21b51c2.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_21%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u34350a08" id="u34350a08"><span data-lake-id="uefabb552" id="uefabb552">因为在Entry中，对于ThreadLocal使用的弱引用，所以当ThreadLocal没有其他引用的时候，Entry中的threadLocal变量就会在下一次GC的时候被回收掉</span></p>
  <p data-lake-id="u6ff86beb" id="u6ff86beb"><span data-lake-id="u6337cae2" id="u6337cae2">​</span><br></p>
  <p data-lake-id="u265b433b" id="u265b433b"><span data-lake-id="u34625228" id="u34625228">但是虽然threadLocal被回收了，Entry中的value还没有回收，这样就可能产生内存泄漏。</span></p>
  <p data-lake-id="u17b5f8f6" id="u17b5f8f6"><span data-lake-id="u0ef88497" id="u0ef88497">​</span><br></p>
 </body>
</html>